package cn.com.dcsgo.utils;

import cn.com.dcsgo.enums.ResponseStatus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

/**
 * ResponseBody封装类
 *
 * @author Dcsgo
 * @since 2025/3/6 12:04
 */
@Data
@Builder
@ApiModel(value = "ResponseResult", description = "ResponseBody封装类")
public class ResponseResult<T> {
    /**
     * 响应时间戳
     *
     * @since 1.0
     */
    @ApiModelProperty("响应时间戳")
    private long timestamp;

    /**
     * 响应状态码
     *
     * @since 1.0
     */
    @ApiModelProperty("响应状态码")
    private String status;

    /**
     * 响应描述
     *
     * @since 1.0
     */
    @ApiModelProperty("响应描述")
    private String message;

    /**
     * 响应的数据
     *
     * @since 1.0
     */
    @ApiModelProperty("返回的数据")
    private T data;

    /**
     * 成功地请求返回包装器
     *
     * @param <T> 数据体对象 null
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> success() {
        return success(null);
    }

    /**
     * 成功地请求返回包装器
     *
     * @param data 返回的数据对象
     * @param <T>  数据对象类型
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> success(T data) {
        return ResponseResult.<T>builder().data(data)
                .message(ResponseStatus.SUCCESS.getDescription())
                .status(ResponseStatus.SUCCESS.getResponseCode())
                .timestamp(System.currentTimeMillis())
                .build();
    }

    /**
     * 失败的请求返回包装器
     *
     * @param message 请求失败的原因
     * @param <T>     数据对象类型
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> fail(String message) {
        return fail(String.valueOf(500), message);
    }

    /**
     * 失败的请求返回包装器
     *
     * @param status  请求失败的状态码
     * @param message 请求失败的原因
     * @param <T>     数据对象类型
     * @return 请求返回的结果
     */
    public static <T> ResponseResult<T> fail(String status,String message) {
        return ResponseResult.<T>builder()
                .message(message)
                .status(status)
                .timestamp(System.currentTimeMillis())
                .build();
    }
}
